#!/usr/bin/env python
#
# Copyright 2010 Facebook
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.

"""Making Facebook work with App Engine"""

FACEBOOK_APP_ID = "129214890487293"
FACEBOOK_APP_SECRET = "829b2358dbf1bbca6a6b5d9ce94620ad"

import facebook
import os.path
import wsgiref.handlers

from google.appengine.ext import db
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext.webapp import template


class User(db.Model):
    id = db.StringProperty(required=True)
    created = db.DateTimeProperty(auto_now_add=True)
    updated = db.DateTimeProperty(auto_now=True)
    name = db.StringProperty(required=True)
    profile_url = db.StringProperty(required=True)
    access_token = db.StringProperty(required=True)
    
class FBEvent:
    name = ''
    location_string = ''
    start_time = ''
    end_time = ''


class BaseHandler(webapp.RequestHandler):
    """Provides access to the active Facebook user in self.current_user

    The property is lazy-loaded on first access, using the cookie saved
    by the Facebook JavaScript SDK to determine the user ID of the active
    user. See http://developers.facebook.com/docs/authentication/ for
    more information.
    """
    @property
    def current_user(self):
        if not hasattr(self, "_current_user"):
            self._current_user = None
            cookie = facebook.get_user_from_cookie(
                self.request.cookies, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET)
            if cookie:
                # Store a local instance of the user data so we don't need
                # a round-trip to Facebook on every request
                user = User.get_by_key_name(cookie["uid"])
                if not user:
                    graph = facebook.GraphAPI(cookie["access_token"])
                    profile = graph.get_object("me")
                    user = User(key_name=str(profile["id"]),
                                id=str(profile["id"]),
                                name=profile["name"],
                                profile_url=profile["link"],
                                access_token=cookie["access_token"])
                    user.put()
                elif user.access_token != cookie["access_token"]:
                    user.access_token = cookie["access_token"]
                    user.put()
                self._current_user = user
        return self._current_user
    
    @property
    def all_events(self):
        if not hasattr(self, "_all_events"):
            cookie = facebook.get_user_from_cookie(
                self.request.cookies, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET)
            if cookie:
                graph = facebook.GraphAPI(cookie["access_token"])
                
                # get uids
                #friends = graph.get_connections("me", "friends", fields="id")
                friendsList = []
                user = User.get_by_key_name(cookie["uid"])
                if not user:
                    profile = graph.get_object("me", fields="id")
                    friendsList.append(str(profile['id']))
                else:
                    friendsList.append(user.id)
                #for f in friends['data']:
                #    friendsList.append(str(f['id']))
                
                # get all events from the uids
                evts = []
                count = 0
                for u in friendsList:
                    count += 1
                    if count < 100:
                        userEvents = graph.get_connections(u, "events")
                        evts.extend(userEvents['data'])
                self._all_events = []
                for e in evts:
                    ev = FBEvent()
                    if 'name' in e:
                        ev.name = e['name']
                    if 'location' in e:
                        ev.location = e['location']
                    if 'start_time' in e:
                        ev.start_time = e['start_time']
                    if 'end_time' in e:
                        ev.end_time = e['end_time']
                    self._all_events.append(ev)
                return self._all_events
        return None
                


class HomeHandler(BaseHandler):
    def get(self):
        path = os.path.join(os.path.dirname(__file__), "index.html")
        args = dict(current_user=self.current_user,
                    all_events=self.all_events,
                    facebook_app_id=FACEBOOK_APP_ID)
        self.response.out.write(template.render(path, args))


def main():
    util.run_wsgi_app(webapp.WSGIApplication([(r"/", HomeHandler)]))


if __name__ == "__main__":
    main()
